package agente;

import java.util.ArrayList;
import javafx.scene.control.TextArea;
import cliente.Cliente;
import dados.Jogador;
import dados.Registo;
import dados.TipoSugestao;

public class AgenteVirtual extends Thread {

	private Jogador jogador;
	private TextArea area;
	private Analista analista;
	private Vigarista vigarista;
	public static ArrayList<Sugestao> sugestoes = new ArrayList<Sugestao>();


	public AgenteVirtual(Cliente cliente){
		this.jogador = cliente.getJogador();
		this.area = cliente.getAgenteTextArea();
		this.analista = new Analista(jogador, cliente.getStocks());
		this.vigarista = new Vigarista(jogador, cliente.getStocks());
	}

	public void run(){
		ArrayList<Registo> historial;
		while(true){
			historial = new ArrayList<Registo> (jogador.getHistorial());
			ArrayList<Sugestao> resultados = new ArrayList<Sugestao>(); 
			if(!historial.isEmpty()){
				resultados.addAll(analista.sugerirComBaseNasCompras(historial, 3));
				resultados.addAll(analista.sugerirComBaseNasVendas(historial, 3));
				resultados.addAll(analista.sugerirComBaseNoVolume(historial, 3));
				resultados.addAll(vigarista.sugerirAleatoriamenteCompras(3));
				resultados.addAll(vigarista.sugerirAleatoriamenteVendas(3));
			}else{
				resultados.addAll(vigarista.sugerirAleatoriamenteCompras(6));
			}
			removeDuplicates(resultados);
			sugestoes = resultados;
			area.setText(convertToText(resultados));
			try {
				sleep(100000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	public void insertListTextArea(ArrayList<String> strings, TextArea area){
		String aux = "";
		for(String s : strings){
			aux = aux + " - " + s;
		}
		area.setText(aux);
	}
	
	public void removeDuplicates(ArrayList<Sugestao> resultados){
		for(int i = 0; i != resultados.size(); i++){
			for(int j = i; j != resultados.size() - 1; j++){
				if(resultados.get(j).equals(resultados.get(i))){
					resultados.remove(j);
					if(resultados.get(i).getTiposugestao() == TipoSugestao.COMPRA_ANALISTA || resultados.get(i).getTiposugestao() == TipoSugestao.COMPRA_VIGARISTA 
							|| resultados.get(i).getTiposugestao() == TipoSugestao.VOLUME_ANALISTA || resultados.get(i).getTiposugestao() == TipoSugestao.OSDOIS_COMPRA){
						resultados.get(i).setTiposugestao(TipoSugestao.OSDOIS_COMPRA);
					}else if(resultados.get(i).getTiposugestao() == TipoSugestao.VENDA_VIGARISTA || resultados.get(i).getTiposugestao() == TipoSugestao.VENDA_ANALISTA 
							|| resultados.get(i).getTiposugestao() == TipoSugestao.OSDOIS_VENDA){
						resultados.get(i).setTiposugestao(TipoSugestao.OSDOIS_VENDA);
					}
					i = 0;
					j = 0;
				}
			}
		}
	}
	
	public String convertToText(ArrayList<Sugestao> resultados){
		String resultado = "";
		for(Sugestao s : resultados){
			switch (s.getTiposugestao()){
				case COMPRA_ANALISTA:
					resultado = resultado + "Compre acções da " + s.getStock().getNome() + ".\n";
					break;
				case VENDA_ANALISTA:
					resultado = resultado + "Venda as acções da " + s.getStock().getNome() + ".\n";
					break;
				case VOLUME_ANALISTA:
					resultado = resultado + "Compre acções da " + s.getStock().getNome() + ".\n";
					break;
				case COMPRA_VIGARISTA:
					resultado = resultado + "Compre acções da " + s.getStock().getNome() + ".\n";
					break;
				case VENDA_VIGARISTA:
					resultado = resultado + "Venda as acções da " + s.getStock().getNome() + ".\n";
					break;
				case OSDOIS_COMPRA:
					resultado = resultado + "Compra as acções da " + s.getStock().getNome() + ".\n";
					break;
				case OSDOIS_VENDA:
					resultado = resultado + "Venda as acções da " + s.getStock().getNome() + ".\n";
					break;
				default:
					break;
			}
		}
		return resultado;
	}
}
